/**
 * Project 68th
 */


#ifndef _TASKQUEUE_H
#define _TASKQUEUE_H

#include <iostream>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <functional>
using std::cout;
using std::endl;
using std::queue;
using std::mutex;
using std::unique_lock;
using std::lock_guard;
using std::condition_variable;
using std::function;

extern mutex coutMutex;

using ElemType = function<void()>;

class TaskQueue {
public: 

    /**
     * @param cap
     */
    TaskQueue(size_t cap);
    ~TaskQueue();

    /**
     * @param val
     */
    //往仓库中添加数据
    void push(ElemType && val);

    //从仓库中取走数据
    ElemType pop();

    //判满与判空
    bool full();
    bool empty();

    //唤醒wait的工作线程
    void wakeup();
private: 
    size_t _capacity; //仓库的容量
    queue<ElemType> _que; //底层存放数据的数据结构 
    mutex _mtx; //对仓库中的数据需要进行互斥访问
    condition_variable _notEmpty; //非空条件变量
    condition_variable _notFull; //非满条件变量
    bool _flag;
};

#endif //_TASKQUEUE_H
